/*
******************************************************************************************************* 
**  Copyright (C) 2019, 苏州检易生物科技有限公司 
**  All rights reserved. 
** 
**  FileName:       	log_console.h
**  Description:	
**  Author:        	 
**  Version				v0.1
**  Date:           	2019-05-17
**	Function List： 
**  History:         
*********************************************************************************************************
*/
/*
*********************************************************************************************************
*                                              	防止重复包含
*********************************************************************************************************
*/

#ifndef _LOG_CONSOLE_H_
#define _LOG_CONSOLE_H_
/*
*********************************************************************************************************
*                                              	调试开关
*********************************************************************************************************
*/
#ifdef __cplusplus
extern "C" {
#endif

/*
*********************************************************************************************************
*                                              	头文件
*********************************************************************************************************
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "stm32h7xx_hal.h"
#include "uart.h"
#include "bsp_conf.h"
#include <stdarg.h>
#ifdef BOOTLOADER
#else
#include "tcp_transfer.h"
#endif
/*
*********************************************************************************************************
*                                              	宏定义
*********************************************************************************************************
*/
#define LOG_ASSERT 1
#ifdef 	LOG_ASSERT
	#define	ASSERT(x)  ((x) ? (void)0 : assert_failed((uint8_t *)__FILE__, __LINE__))
	void assert_failed(uint8_t* file, uint32_t line);
#else 
	#define	 ASSERT(x) ((void)0)
#endif

#define  DebugLog(fmt,...)            log_print(DEBUG_LEVEL,NULL,0,fmt,##__VA_ARGS__)

#define  TraceLog(fmt,...)            log_print(TRACE_LEVEL,NULL,0,fmt,##__VA_ARGS__)

#define  CriticalLog(fmt,...)	       log_print(CRITICAL_LEVEL,__FILE__,__LINE__,fmt,##__VA_ARGS__)

#define  ErrorLog(fmt,...)            log_print(ERROR_LEVEL,__FILE__,__LINE__,fmt,##__VA_ARGS__)
	
#define  Debug_Log(fmt,...)            log_print(DEBUG_LEVEL,NULL,0,fmt,##__VA_ARGS__)

#define  Trace_Log(fmt,...)            log_print(TRACE_LEVEL,NULL,0,fmt,##__VA_ARGS__)

#define  Critical_Log(fmt,...)	       log_print(CRITICAL_LEVEL,__FILE__,__LINE__,fmt,##__VA_ARGS__)

#define  Error_Log(fmt,...)            log_print(ERROR_LEVEL,__FILE__,__LINE__,fmt,##__VA_ARGS__)

#define LOG_CONSOLE_UART_BAUDRATE	115200
	
#define LOG_CONSOLE_TX_MEM_SIZE		4096
	
//#define LOG_CONSOLE_RX_MEM_SIZE		128

#define	LOG_TTY_BUF_SIZE		1024
/*
*********************************************************************************************************
*                                              枚举和结构体类型定义
*********************************************************************************************************
*/
typedef struct{
	struct BSP_UART * p_uart;
	
	
	uint16_t  mem_size;
	uint8_t * mem_head;
	uint8_t * mem_tail;
	
	uint16_t	txbuff_size;
	uint8_t * dma_tx_head;
	
	uint16_t	dma_tx_size;
}log_console_t;


typedef enum{
	ERROR_LEVEL,
	CRITICAL_LEVEL,
	TRACE_LEVEL,
	DEBUG_LEVEL,
	LEVEL_SIZE
}log_level_t;

typedef void (*log_tx_callback)(uint8_t* buff,uint16_t size);
/*
*********************************************************************************************************
*                                              	全局变量声明
*********************************************************************************************************
*/
/*
*********************************************************************************************************
*                                              	函数声明
*********************************************************************************************************
*/
void log_console_init(void);
void log_console_output(uint8_t * buff,uint16_t size);
void log_console_wait_cplt(void);
int  log_print(uint8_t level,const char *file,int line,const char * fmt,...);
void log_tx_cb_reg(log_tx_callback callback);
void log_print_hex(uint8_t* buff,uint16_t size);

#ifdef __cplusplus
}
#endif

#endif
